\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage[francais]{babel} 
\usepackage{listings}
\usepackage{graphicx}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{fancyvrb}
\usepackage{textpos}

\usepackage{multido}
\usetheme{Frankfurt}

\setbeamertemplate{footline}[page number] 

% Chemin images...
\graphicspath{{images/}}

% Affichage du plan au changement de partie
\AtBeginSection[]
{ \begin{frame}<beamer> 
    \frametitle{Plan} 
    \tableofcontents[currentsection] 
  \end{frame} }

\title{Soutenance TER \\ Moteur de convolution multi-architecture}
\author{\textsc{V.Allombert}, \textsc{A.Blanchard},\\
  \textsc{A.Carteron}, \textsc{V.Pelletier}}

\begin{document}

\begin{frame}
  \titlepage
\end{frame}

% Table of content
\begin{frame}
  \frametitle{Plan}
  \tableofcontents
\end{frame}

% Le domaine
\section{Domaine}
\begin{frame}{Description du domaine}
  Notre projet est à l'intersection de deux domaines :
  \begin{itemize}
  \item La programmation massivement multiprocesseurs avec la technologie CUDA
  \item Le traitement par matrice de convolution
  \end{itemize}
\end{frame}

\subsection{La programmation massivement multiprocesseur}
\begin{frame}{CUDA}
  CUDA : Compute Unified Device Architecture
  \begin{itemize}
  \item Développé par NVidia
  \item Principe :
    \begin{itemize}
      \item une architecture GPU
      \item une bibliothèque
    \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}{Les Origines}
  Pour répondre à un besoin constant d'accroître la puissance de calcul :
  \begin{figure}[h!]
    \centering
    \includegraphics[scale=0.30]{images/timeline.png}
  \end{figure}

\end{frame}

\begin{frame}{L'architecture CUDA}
  \begin{center}
    \includegraphics[scale=0.5]{images/texbitches.png}
  \end{center}
  \begin{itemize}
  \item Stream Processor(SP) : Séquentiel
  \item Multi-Processor Stream(MPS) : Parallèle
  \item Graphic Processor Unit(GPU) : Parallèle
  \end{itemize}
\end{frame}

\begin{frame}{Les outils fournis pour utiliser CUDA}
  Différents outils sont fournis pas NVidia pour tirer partie de l'architecture CUDA :
  \begin{itemize}
    \item Un pilote
    \item Un SDK
    \item des Bibliothèques
  \end{itemize}
\end{frame}

\subsection{Les matrices de convolution}
\begin{frame}{Fonctionnement des matrices de convolution}
  Formule à appliquer pour une convolution :
\[
  \forall x,y :
 sortie(x,y) =  
\]
\[
\frac{\sum_{i=1}^{dimy} \sum_{j=1}^{dimx}
  entree ( x-\lfloor\frac{dimx}{2}\rfloor-j ,
  y-\lfloor\frac{dimy}{2}\rfloor-i)*matrice(i,j)}{diviseur}
  \]
  \begin{center}
    \includegraphics[scale=0.3]{images/convolution.jpg}
  \end{center}
\end{frame}

\begin{frame}{Utilité des matrices de convolution}
  Exemples d'utilisation des matrices de convolution :
  \begin{itemize}
  \item Traitements sur les images :
    \begin{itemize}
      \item flous
      \item détections de contours
      \item translations
    \end{itemize}
  \end{itemize}
\end{frame}

% Description
\section{Description}
\begin{frame}{Description générale du logiciel}
\begin{itemize}
\item Moteur de convolution
\item Simple d'utilisation
\item Générique (software)
\item Générique (hardware)
\item Performant
\end{itemize}
\end{frame}

% Architecture
\section{Architecture}
\begin{frame}{Architecture}
  \begin{center}
    \includegraphics[scale=0.4]{images/diagramme.png}
  \end{center}
\end{frame}
\begin{frame}{Architecture}
  \begin{center}
    \includegraphics[scale=0.4]{images/diagcuda.png}
  \end{center}
\end{frame}
\begin{frame}{Résumé de l'architecture}
  \begin{center}
    \includegraphics[scale=0.225]{images/resume.png}
  \end{center}
\end{frame}

% Points techniques
\section{Points techniques}
\subsection{Streaming}
\begin{frame}{Stream}
\begin{itemize}
\item Intérêt des streams : 
  \begin{itemize}
  \item Limiter l'impact des transferts mémoire
  \item Les copies de données entre RAM et GPU sont asynchrones\\
  \end{itemize}
\item Contrainte : Utilisation de la ``page-locked''(pinned) memory.
\end{itemize}
\end{frame}

\begin{frame}{Stream}
Principe de fonctionnement des streams :\\

\begin{itemize}
  \item Allocation en pinned-memory
  \item Transfert des données en mémoire GPU (asynchrone)
  \item Appel du kernel de convolution (asynchrone)
  \item Retour des données en mémoire RAM (asynchrone)
\end{itemize}
\end{frame}

\begin{frame}{Stream}
  \begin{center}
    \includegraphics[scale=0.5]{images/stream.png}
  \end{center}
\end{frame}

\subsection{Optimisations Mémoire}
\begin{frame}{Optmisations Mémoire}
2 axes d'optimisations abordés :
\begin{itemize}
\item Textures
\item Mémoire ``Shared'' des blocs Multi-Processeurs
\end{itemize}
\end{frame}

\begin{frame}{Optimisations Mémoire - Texture}
  Avantages de la mémoire texture :
  \begin{itemize}
    \item Simplicité d'accès ({\tt getTex2D(texture, x, y)})
    \item Vitesse d'accès théorique largement accrue en lecture seule
  \end{itemize}
  Contraintes :
  \begin{itemize}
    \item Utilisation de cudaArray presque obligatoire
    \item Ne peut être utilisée pour la sortie
  \end{itemize}
\end{frame}
\begin{frame}{Optimisations Mémoire - Shared Memory}
Avantage de la shared : Mémoire {\bf très} rapide.\\
Contraintes :
\begin{itemize}
  \item Quantité très limitée ($\sim$16 kB)
  \item Mécanismes d'alignement et de gestion très spéciaux
\end{itemize}
\begin{center}
  \includegraphics[scale=0.20]{images/banks.png}
\end{center}
\end{frame}
\begin{frame}{Optimisations Mémoire - Système résultant}
\begin{itemize}
\item Bloc d'entrée en mémoire texture
\item Buffer de traitement en mémoire shared \\
  {\tt \_\_shared\_\_ tmp\_out[NB\_THREADS][32*n +1]}
\item Bloc de sortie en mémoire ``normale''
\end{itemize}
Exemple dans notre cas :
\begin{center}
\includegraphics[scale=0.35]{images/optsyst.png}
\end{center}
\end{frame}

% Fonctionnement
\section{Fonctionnement}
\begin{frame}{Exemple : détection de bords}
  Application d'une convolution de type ``détection de bords'' :
  \begin{center}
    \begin{tabular}{ | c | c|  c | } \hline
      2 & 1 & 0 \\ \hline
      1 & 0 & -1  \\ \hline
      0 & -1 & -2 \\ \hline
    \end{tabular}
  \end{center}
  \begin{center}
    \includegraphics[scale=0.1]{images/nous_avant.jpg}
  \end{center}
\end{frame}
\begin{frame}{Exemple : détection de bords}
  \begin{center}
    \includegraphics[scale=0.19]{images/nous_apres.jpg}
  \end{center}
\end{frame}


\begin{frame}[fragile]{Exemple : code correspondant}
\begin{Verbatim}[fontsize=\tiny]
  #include "matrix.hh"
  #include "image.hh"
  #include "convolution.hh"
    
  int main(int argc, char* argv[]){
    Image image (argv[1]);
    Image sortie(image.width(), image.height());
     
    Matrix<int> matrix(3, 3);
    //Initialisation de la matrice de convolution
      
    Convolution engine(matrix, 1);
    engine.convol(image, sortie);

    result.save("sortie.bmp");
      
    return 0;
  }
\end{Verbatim}
\end{frame}




% Résultats
\section{Résultats}
\begin{frame}{Performances CUDAAAAAHHH!!\includegraphics[scale=0.05]{images/cretin} }

  \begin{figure}[H]
    \begin{minipage}{0.55\linewidth}
      \flushleft
      \resizebox{5,5cm}{!}{
        \begin{tikzpicture}
          \begin{axis}[grid=major,
              xlabel=$MultiProcessorStream$,
              ylabel=$Temps (secondes)$]
            \addplot[smooth,mark=x,red] plot coordinates {
              (15,6.4)
              (30,4.7)
              (45,3.7)
            };
            \addlegendentry{96 threads}

            \addplot[smooth,color=green,mark=x]
            plot coordinates {
              (15,7.7)
              (30,5.7)
              (45,4.5)
            };
            \addlegendentry{64 threads}

            \addplot[smooth,color=blue,mark=x]
            plot coordinates {
              (15,13.7)
              (30,7.7)
              (45,6.3)
            };
            \addlegendentry{32 threads}
          \end{axis}
        \end{tikzpicture}
      }
      \end{minipage}\hfill
    \begin{minipage}{0.45\linewidth}
      \flushleft
      \flushleft
      Pour une résolution de $12800*12800$ :
      \begin{itemize}
      \item 45 MPS de 96 Threads : 3,7 sec
      \item 4 coeurs : 17,9 sec
      \item Séquentiel : 70 sec
      \end{itemize}
    \end{minipage}\hfill
  \end{figure}
\end{frame}

\begin{frame}{Résultats des tests}
  \begin{center}
    Démonstration ?\\
    Questions ?
  \end{center}
\end{frame}

\end{document}

